package com.boardgame.example.tris.impl;

import java.util.ArrayList;
import java.util.List;

import com.boardgamelib.base.direzioni.DirezioniCelleQuadrate;
import com.boardgamelib.base.entity.TabelloneQuadrato;
import com.boardgamelib.base.system.SistemaGiocatoriGenerico;
import com.boardgamelib.base.system.SistemaProssimitaQuadrato;
import com.boardgamelib.base.system.SistemaTabelloneGenerico;
import com.boardgamelib.entity.Gioco;
import com.boardgamelib.system.SistemaCheGestisceLeCelleVicineOvveroQuelleProssime;
import com.boardgamelib.system.SistemaGiocatori;
import com.boardgamelib.system.SistemaMosse;
import com.boardgamelib.system.SistemaTabellone;

/** Test gioco del tris, i nomi delle variabili sono ad uso e consumo di Rinaldi :D
 * 
 * @author g.terenziani
 *
 */
public class GiocoGiocoTris implements Gioco<DirezioniCelleQuadrate, CellaTris, GiocatoreTris, PezzoTris, MossaTris> {
	
	private TabelloneQuadrato<CellaTris, PezzoTris> u;
//	private Tabellone<CellaTris> u;
	
	private SistemaCheGestisceLeCelleVicineOvveroQuelleProssime<DirezioniCelleQuadrate, CellaTris> nearestSystem;
	private SistemaTabelloneGenerico<CellaTris, PezzoTris, GiocatoreTris> eripognosticoColloidalCozza;
	private SistemaGiocatoriGenerico<GiocatoreTris> xpytrylitzSnafuGirante;
	
	private SistemaMosseTris ustmbocildicoProtomeico;
	
	public void nuovaPartita() {
		List<CellaTris> agnagna = new ArrayList<CellaTris>(); 
		for (int x = 0; x < 3; x++) {
			for (int y = 0; y < 3; y++) {
				CellaTris agna = new CellaTris(y + x*3);
				agnagna.add(agna);
			}
		}
		u.setCelle(agnagna);
	}
	
	public GiocoGiocoTris() {
		// Crea il tabellone
		u = new TabelloneQuadrato<CellaTris, PezzoTris>(3);
		nuovaPartita();
		// Crea i sistemi
		nearestSystem = new SistemaProssimitaQuadrato(u);
		eripognosticoColloidalCozza = new SistemaTabelloneGenerico<CellaTris, PezzoTris, GiocatoreTris>(u);
		ustmbocildicoProtomeico = new SistemaMosseTris();
		xpytrylitzSnafuGirante = new SistemaGiocatoriGenerico<GiocatoreTris>();
		// Sistema le creazioni
		xpytrylitzSnafuGirante.aggiungiGiocatore(new GiocatoreTris(this, "Player 1", TipiPezzoTris.ICS));
		xpytrylitzSnafuGirante.aggiungiGiocatore(new GiocatoreTris(this, "Player 2", TipiPezzoTris.TONDO));
		// Crea le sistemazioni
		// Sfancula qua e la
		
	}

	public SistemaCheGestisceLeCelleVicineOvveroQuelleProssime<DirezioniCelleQuadrate, CellaTris> getSistemaCheGestisceLeCelleVicineOvveroQuelleProssime() {
		return nearestSystem;
	}

	public SistemaTabellone<CellaTris, PezzoTris, GiocatoreTris> getSistemaTabellone() {
		return eripognosticoColloidalCozza;
	}

	public SistemaMosse<DirezioniCelleQuadrate, CellaTris, GiocatoreTris, PezzoTris, MossaTris> getSistemaMosse() {
		return ustmbocildicoProtomeico;
	}

	public SistemaGiocatori<GiocatoreTris> getSistemaGiocatori() {
		// TODO Auto-generated method stub
		return xpytrylitzSnafuGirante;
	}

}
